/*!
    \file    main.c
    \brief   Application main function
    \author  赵一凡 (tutustr@163.com)
    \version V1.0.0
    \date    2024-01-10

    \note    Application for GD32F470ZGT6
    \copyright Copyright (c) 2024 赵一凡. All rights reserved.
*/

#include "gd32f4xx.h"
#include "gd32f4xx_gpio.h"
#include "gd32f4xx_rcu.h"
#include "gd32f4xx_fmc.h"
#include "gd32f4xx_usart.h"
#include "systick.h"
#include "app_update.h"
#include "device_info.h"
#include "led.h"
#include "globalDevice.h"
#include "Lcd.h"
#include "Gui.h"
#include <stdio.h>
/* 函数声明 */
static void system_init(void);

/* 使用at属性指定地址，used确保不被优化掉，const确保只能读不能写 */
volatile const device_info_t device_info __attribute__((section(".device_info"))) __attribute__((used)) = {
    .app_valid_flag = 1,
    .app_size = 0,
    .app_crc = 0,
    .app_version = 0x01000000, // 版本1.0.0.0
    .device_id = {0},
    .reserve = {0}};

/*!
    \brief      主函数
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    /* 系统初始化 */
    system_init();
    device_pin_init();

    /* 初始化定时器变量 */
    uint32_t led_timer = 0;
    uint32_t check_timer = 0;

    delay_init(&led_timer);
    delay_init(&check_timer);
    Lcd_Init();
    LCD_Fill(0, 0, LCD_W, LCD_H, COLOR_BLUE); // 深蓝色 背景
    /* 主循环 */
    while (1)
    {
        /* 处理串口升级请求 */
        app_update_process();

        /* LED闪烁任务 - 每500ms闪烁一次 */
        if (delay_check(&led_timer, 1000))
        {
            led_toggle(LED1);
        }

        /* 检查系统状态 - 每2000ms执行一次 */
        if (delay_check(&check_timer, 200))
        {
            led_toggle(LED2);
            /* 可以添加系统状态检查代码 */
        }
    }
}

/*!
    \brief      系统初始化
    \param[in]  none
    \param[out] none
    \retval     none
*/
static void system_init(void)
{
    /* 配置系统时钟和滴答定时器 */
    systick_config();

    /* 使能串口所需时钟 */
    rcu_periph_clock_enable(RCU_GPIOA);  // USART0 GPIO
    rcu_periph_clock_enable(RCU_USART0); // USART0
}

// 初始化
void app_init(void)
{
}
